#include <iostream>
#include <unistd.h>
#include <signal.h>

void handler(int signo)
{
    std::cout << "获取信号: " << signo << std::endl;
    while(true)
    {
        sigset_t pending;
        sigemptyset(&pending);
        sigpending(&pending);

        for(int i = 31; i > 0; i--)
        {
            if(sigismember(&pending, i))
                std::cout << "1";
            else
                std::cout << "0";
        }

        std::cout << std::endl;
        sleep(1);

    }

}

//sigaction和signal的区别:可以防止任意信号进行递归处理
// 当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自
// 动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到
// 当前处理结束为止。 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一
// 些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;//新处理方法
    act.sa_flags = 0;
    sigemptyset(&(act.sa_mask));
    
    sigaddset(&(act.sa_mask), 3);
    sigaddset(&(act.sa_mask), 4);
    sigaddset(&(act.sa_mask), 5);
    sigaddset(&(act.sa_mask), 6);
    sigaddset(&(act.sa_mask), 7);

    //将2号信号处理方法写入内核
    sigaction(2, &act, &oact);

    while(true)
    {
        std::cout << "进程: " << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}